package torres.entity;
import java.util.ArrayList;
import java.util.LinkedHashSet;

import torres.ability.Ability;
import torres.action.Effect;
import torres.fileIO.Saveable;
import torres.item.WeaponType;

/**
 * @author Torres
 * This interface will provide a skeleton for all the
 * occupations that we will have. An occupation defines
 * an Entities Abilities and statistic multipliers.
 */
public interface Occupation extends Saveable {
	public enum Stat {
		AGILITY, STRENGTH, INTELLECT
	}
	public enum Job {
		SUMMONER, SNEAK, SMASHER
	}
	
	/**
	 * Returns the primary Stat associated the Occupation
	 * @return The primary Stat
	 */
	public Stat getPrimaryStat();
	
	
	/**
	 * Returns the enum representing the Occupation
	 * @return The enum representing the Occupation
	 */
	public Job getJob();
	
	/**
	 * Returns the strength multiplier.
	 * @return strength multiplier.
	 */
	public double getStrengthMultiplier();
	
	/**
	 * Returns the agility multiplier.
	 * @return agility multiplier.
	 */
	public double getAgilityMultiplier();
	
	/**
	 * Returns the intellect multiplier.
	 * @return intellect multiplier.
	 */
	public double getIntellectMultiplier();
	
	/**
	 * Returns the list of abilities. 
	 * @return list of abilities.
	 */
	public LinkedHashSet<Ability> getAbilityList();
	
	
	public boolean allocateSkillPoint(Skill skill);
	
	/**
	 * Updates Occupation with ability list based on given level
	 * @param level used to update ability list
	 */
	public void updateAbilityList(int level);
	
	public LinkedHashSet<String> retreiveSkillList(LinkedHashSet<String> skillList);

	public LinkedHashSet<Skill> retreiveSkillEnumList(LinkedHashSet<Skill> hashSet);
	public LinkedHashSet<Ability> getAttackList();
	//public void setAttackList(ArrayList<Ability> attackList);
	
	public void moveHook(Entity e);
	
	public boolean canEquip(WeaponType type);
	
	public double applySkill(Effect e);
}
